<?php

/**
 * @Author: gan
 * @Description: jpush推送实现
 * @File:  Push
 * @Version: 1.0.0
 * @Date: 2021/12/27 2:35 下午
 * 参考文档：https://docs.jiguang.cn/jpush/server/push/rest_api_v3_push/
 */
declare(strict_types=1);

namespace RX\Component\Push\Impl;

use RX\Helpers\StringHelper;
use RX\Traits\CurlTrait;

class JpushImpl implements PushInterface
{
    use CurlTrait;

    private $appKey       = '';                                        //待发送的应用程序(appKey)，只能填一个。
    private $masterSecret = '';                                        //主密码
    private $url          = "https://api.jpush.cn/v3/push";            //推送的地址

    public const MSG_ARR = [
        1000 => "系统内部错误",
        1001 => "只支持 HTTP Post 方法",
        1002 => "缺少了必须的参数",
        1003 => "参数值不合法",
        1004 => "验证失败",
        1005 => "消息体太大",
        1008 => 'app_key 参数非法',
        1009 => "推送对象中有不支持的 key",
        1011 => "没有满足条件的推送目标",
        1012 => "符合当前条件的推送已超过限制",
        1016 => "1016参数非法",//可能是因为没有开通对应厂商系统通道权限，但传递了厂商系统特性参数导致；也可能是传递的其它参数所对应的功能权限未开通。
        1017 => "1017参数非法",//一般是因为传递了互斥的多个系统通道参数属性导致
        1018 => "1018参数非法",//请检查 callback 回调参数指定的 URL 是否在极光官网配置
        1020 => "只支持 HTTPS 请求",
        1030 => "内部服务超时",
        2002 => "API调用频率超出该应用的限制",
        2003 => "该应用 appkey 已被限制调用 API",
        2004 => "无权限执行当前操作",
        2005 => "信息发送量超出合理范围",
        2006 => "非VIP用户",
        2007 => "无权调用此接口",
        2008 => "广播推送超出频率限制",
        2009 => "2009推送请求被限制",//推送方式被系统限制；或者如果是厂商推送，请确认是否在厂商允许推送时间范围；更详细可以联系技术支持查明限制原因和寻求帮助。
        2010 => "2010推送请求被限制",//推送内容包含黑词，或者推送总量超限。
    ];

    public function __construct(array $config = [])
    {
        if (empty($config)) {
            $config = StringHelper::config('push.jpush');
        }
        $this->appKey       = $config["appKey"];
        $this->masterSecret = $config["masterSecret"];
    }


    public function push(array $data)
    {
        $base64  = base64_encode("$this->appKey:$this->masterSecret");
        $headers = [
            "Content-Type"  => "application/json",
            "Authorization" => "Basic {$base64}"
        ];
        return $this->postCurl($this->url, $data, true, 5, $headers);
    }
}
